<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2015/10/21
 * Time: 14:46
 *
 * 支付宝  即时到帐 开发。
 *
 */
namespace Home\Controller;
use Think\Controller;

class PayController extends Controller{

    // 加载 即使到帐的 相关类库
    public function _initialize(){
        vendor('Alipay.Corefunction');
        vendor('Alipay.Md5function');
        vendor('Alipay.Notify');
        vendor('Alipay.Submit');
    }

    /**
     * 即时到帐
     * 请求 入口
     */
    public function alipay_api(){
        //获取 参数
        $url_config = C('ALIPAY_URL_CONFIG');
        $alipay_config = C('ALIPAY_CONFIG');
        $post = I('post.');

        /************** 请求参数 **************/
        $payment_type = "1"; //支付类型 必填，不可更改
        $notify_url = $url_config['notify_url'] ;//服务器异步通知页面路径
        $return_url = $url_config['return_url']; //页面跳转同步通知页面路径
        /***************** post 提交过来的参数 ***************/
        $out_trade_no   = $post['trade_no'];// 商户网站订单系统中 商户订单号 唯一 必填
        $subject        = $post['subject'];//订单名称 必填
        $total_fee      = $post['total_fee']; //付款金额  必填

        $body           = $post['body'];  //订单描述
        $show_url       = $post['show_url']; //商品展示地址
        $anti_phishing_key = ""; //防钓鱼时间戳 若要使用请调用类文件submit中的query_timestamp函数
        $exter_invoke_ip = get_client_ip(); //客户端的IP地址

        /************************************************************/

        //构造要请求的参数数组，无需改动
        $parameter = array(
            "service" => "create_direct_pay_by_user",
            "partner" => trim($alipay_config['partner']),
            "seller_email" => trim($alipay_config['seller_email']),
            "payment_type"	=> $payment_type,
            "notify_url"	=> $notify_url,
            "return_url"	=> $return_url,
            "out_trade_no"	=> $out_trade_no,
            "subject"	=> $subject,
            "total_fee"	=> $total_fee,
            "body"	=> $body,
            "show_url"	=> $show_url,
            "anti_phishing_key"	=> $anti_phishing_key,
            "exter_invoke_ip"	=> $exter_invoke_ip,
            "_input_charset"	=> trim(strtolower($alipay_config['input_charset']))
        );

        //建立请求
        $alipaySubmit = new AlipaySubmit($alipay_config);
        $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
        echo $html_text;
    }


    /**
     * 同步 通知 支付 返回
     */
    public function return_url(){
        $alipay_config = C('ALIPAY_CONFIG');
        //计算得出通知验证结果
        $alipayNotify = new AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyReturn();
        if($verify_result) {
        //验证成功
            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
            //接收 参数
            $get = I('get.');

            $out_trade_no = $get['out_trade_no'];//商户订单号
            $trade_no = $get['trade_no'];//支付宝交易号
            $trade_status = $get['trade_status'];//交易状态
            if($get['trade_status'] == 'TRADE_FINISHED' || $get['trade_status'] == 'TRADE_SUCCESS') {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //如果有做过处理，不执行商户的业务程序
            }else {
                echo "trade_status=".$_GET['trade_status'];
            }

            echo "验证成功<br />";

            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

        }
        else {
            //验证失败
            //如要调试，请看alipay_notify.php页面的verifyReturn函数
            echo "验证失败";
        }
    }


    /**
     * 异步 通知 支付 返回
     *
     */
    public function notify_url(){
        //获取 配置参数
        $alipay_config = C('ALIPAY_CONFIG');
        //计算得出通知验证结果
        $alipayNotify = new AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyNotify();
        if($verify_result) {
        //验证成功
            //获取 传递过来的 参数
            $post = I('post.');
            $trade_no = $post['out_trade_no'];//商户订单号
            $trade_no = $post['trade_no'];//支付宝交易号
            $trade_status = $post['trade_status'];//交易状态
            if($_POST['trade_status'] == 'TRADE_FINISHED') {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //如果有做过处理，不执行商户的业务程序

                //注意：
                //退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知

                //调试用，写文本函数记录程序运行情况是否正常
                //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
            }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //如果有做过处理，不执行商户的业务程序

                //注意：
                //付款完成后，支付宝系统发送该交易状态通知

                //调试用，写文本函数记录程序运行情况是否正常
                //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
            }

            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

            echo "success";		//请不要修改或删除
        }else {
            //验证失败
            echo "fail";

            //调试用，写文本函数记录程序运行情况是否正常
            //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
        }
    }


}